package com.proyecto.core.vista.echo.componentes;
import java.util.ArrayList;
import java.util.List;

import com.proyecto.core.Utilidades.UtilReflect;

import echopointng.BorderEx;
import echopointng.table.PageableSortableTable;
import echopointng.table.SortableTableHeaderRenderer;
import nextapp.echo2.app.Color;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Font;
import nextapp.echo2.app.Insets;
import nextapp.echo2.app.Row;
import nextapp.echo2.app.table.DefaultTableModel;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.layout.ColumnLayoutData;
import nextapp.echo2.app.Alignment;

@SuppressWarnings("serial")
public class rowTabla extends Row {
	
	private PageableSortableTable tabla = new PageableSortableTable();
	private DefaultTableModel dtm;
	private Row rowTabla;
	private List<String> atributos = new ArrayList<String>();
	private int cantidadDeAtributos;
	
	/**
	 * Constructor por Defecto
	 * @author Carlos Yepez.
	 */
	public rowTabla() {
		super();
		initComponents();
	}
	
	/**
	 * Constructor que recibe por parametros una lista de titulos y una lista
	 * de atributos de los pojos que mostrara la tabla.
	 * @param titulos: List<String> que contiene los titulos que se monstraran en el encabezado
	 * @param atributos: List<String> que contiene los atributos de los pojos que se mostraran en la tabla
	 * @throws Exception 
	 */
	public rowTabla(List<String> titulos, List<String> atributos) throws Exception {
		super();
		initComponents();
		this.atributos = atributos;
		this.cantidadDeAtributos = atributos.size();
		this.verificarTitulosVsAtributos(titulos.size(), atributos.size());
		dtm = new DefaultTableModel(titulos.size(),0);
		
		for (int i = 0; i < titulos.size(); i++) {
			dtm.setColumnName(i, titulos.get(i));
		}
		tabla.setSelectionEnabled(true);
		tabla.setDefaultHeaderRenderer(this.configurarCabeceraTabla());
		rowTabla.add(tabla);
	}
	
	/**
	 * Verifico que el numero de titulos corresponda al numero de atributos que contiene la tabla.
	 * @param nroTitulos
	 * @param nroAtributos
	 * @throws Exception
	 */
	private void verificarTitulosVsAtributos(int nroTitulos, int nroAtributos) throws Exception{
		if(nroTitulos != nroAtributos){
			throw new Exception("El numero de campos de los titulos es distinto a el numero de atributos");
		}
	}

	/**
	 * Configura el estilo de la cabecera: Color de fondo, Color de borde, margen de los encabezados,
	 * tamanno de la letra, estilo de la fuente, etc..
	 */
	public SortableTableHeaderRenderer configurarCabeceraTabla(){
		SortableTableHeaderRenderer s = new SortableTableHeaderRenderer();
		s.setBackground(new Color(0xd0d0d0));//color de fondo.
        s.setBorder(new BorderEx(new Color(0xd0d0d0)));//color del borde.
        s.setInsets(new Insets(new Extent(0, Extent.PX),new Extent(0, Extent.PX), 
        			new Extent(0, Extent.PX), new Extent(0, Extent.PX)));//margen de los encabezados.
        tabla.setFont(new Font(new Font.Typeface("sans-serif"), Font.PLAIN,
				new Extent(8, Extent.PT)));
        return s;
        
	}
	
	/**
	 * Recorre la lista de POJOS que se quiere mostrar en la tabla
	 * extrae los atributos que contiene el List de atributos seteados
	 * en la variable miembro de clase "atributos". Llena un arreglo con
	 * cada uno de esos campos para cada pojo
	 * @param listDeDatos: Lista de POJOS que se quiere mostrar en la tabla
	 * @return void
	 * @throws Exception : Si esta mal seteado alguno de los atributos del pojo
	 * @author Carlos Yepez.
	 */
	public void cargarTabla(List<Object> listDeDatos) throws Exception{
		Object atributo;
		for(int i =0 ; i< listDeDatos.size(); i++){
			String[] campos =new String[cantidadDeAtributos];
			for(int j = 0 ; j < cantidadDeAtributos; j++){
				atributo = UtilReflect.invocarMetodoGet(
						listDeDatos.get(i), atributos.get(j).toString(), null);
				campos[j] = atributo==null?"":atributo.toString();
			}//EoF
			dtm.addRow(campos);
		}//EoF
	}
	
	public PageableSortableTable getTabla() {
		return tabla;
	}
	
	public void setTabla(PageableSortableTable tabla) {
		this.tabla = tabla;
	}
	
	public DefaultTableModel getDtm() {
		return dtm;
	}
	
	public void setDtm(DefaultTableModel dtm) {
		this.dtm = dtm;
	}

	/**
	 * Configures initial state of component.
	 * WARNING: AUTO-GENERATED METHOD.
	 * Contents will be overwritten.
	 */
	private void initComponents() {
		Column column1 = new Column();
		add(column1);
		rowTabla = new Row();
		ColumnLayoutData rowTablaLayoutData = new ColumnLayoutData();
		rowTablaLayoutData.setAlignment(new Alignment(Alignment.CENTER,
				Alignment.DEFAULT));
		rowTabla.setLayoutData(rowTablaLayoutData);
		column1.add(rowTabla);
	}

	public int getCantidadDeAtributos() {
		return cantidadDeAtributos;
	}

	public void setCantidadDeAtributos(int cantidadDeAtributos) {
		this.cantidadDeAtributos = cantidadDeAtributos;
	}

	public List<String> getAtributos() {
		return atributos;
	}

	public void setAtributos(List<String> atributos) {
		this.atributos = atributos;
	}
}